/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 *
 *           File:  nchoosek.h
 *    Description:  Вычисление числа сочетаний.
 *					Требуется для вычисления вероятности.
 *
 *         Author:  Aleksey Golovchenko (lexgolovchenko@gmail.com)
 *        Created:  20.03.2013 16:51:06
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */


#ifndef NCHOOSEK_H_
#define NCHOOSEK_H_

#include <stdexcept>

/*
 * Вычисление числа сочетаний с помощью
 * таблицы биномиальных коэффициентов (треугольник Паскаля)
 */
template <int N> class C_Nk {
public:
	C_Nk() {
		for (int i = 0; i <= N; ++i) {
			m_B[i][0] = 1;
			m_B[i][i] = 1;
			for (int j = 1; j < i; ++j) {
				m_B[i][j] = m_B[i - 1][j - 1] + m_B[i - 1][j];
			}
		}
	}

	inline const __float128 operator()(int n, int k) throw() {
		if (n > N || k > N) {
			throw std::out_of_range("Binom coefficient table index out if range");
		}

		return m_B[n][k];
	}

private:
	__float128 m_B[N + 1][N + 1];
};



#endif
